home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / amiga / gui / prcgntn1.lha / Precognition / source / Intuition_utils.c < prev    next >
C/C++ Source or Header  |  1992-12-23  |  5KB  |  216 lines

  1. #include "Intuition_utils.h"
  2. #include <proto/all.h>
  3.  
  4. #define DONT_KNOW -2
  5.  
  6. #define FIRST_V2_LIB 36
  7.  
  8. BOOL is_Workbench_v2( void )
  9.    /* returns TRUE if you're running Workbench 2.0 */
  10. {
  11.    static BOOL is_Wb2 = DONT_KNOW;
  12.    struct Library *lib;
  13.  
  14.    if (DONT_KNOW == is_Wb2)
  15.    {
  16.       if (lib = OpenLibrary( "intuition.library", FIRST_V2_LIB ))
  17.       {
  18.          is_Wb2 = TRUE;
  19.          CloseLibrary(lib);
  20.       }
  21.       else
  22.          is_Wb2 = FALSE;
  23.    }
  24.  
  25.    return (BOOL) is_Wb2;
  26. }
  27.  
  28.  
  29. void GadgetRelativeCoords( struct Gadget       *gadget,
  30.                            struct IntuiMessage *event,
  31.                            Point               *point )
  32. {
  33.    struct Window *window;
  34.  
  35.    window = event->IDCMPWindow;
  36.  
  37.    point->x  = event->MouseX - gadget->LeftEdge;
  38.    point->y  = event->MouseY - gadget->TopEdge;
  39.  
  40.    if (window->Flags & GIMMEZEROZERO)
  41.    {
  42.       point->x -= window->BorderLeft;
  43.       point->y -= window->BorderTop;
  44.    }
  45.  
  46. }
  47.  
  48.  
  49.  
  50. static USHORT __chip BusyPointerData[] =
  51. {
  52.    0x0000,0x0000,
  53.    0x0400,0x07C0,0x0000,0x07C0,0x0100,0x0380,0x0000,0x07E0,
  54.    0x07C0,0x1FF8,0x1FF0,0x3FEC,0x3FF8,0x7FDE,0x3FF8,0x7FBE,
  55.    0x7FFC,0xFF7F,0x7EFC,0xFFFF,0x7FFC,0xFFFF,0x3FF8,0x7FFE,
  56.    0x3FF8,0x7FFE,0x1FF0,0x3FFC,0x07C0,0x1FF8,0x0000,0x07E0,
  57.    0x0000,0x0000,
  58. };
  59.  
  60.  
  61. void SetWaitPointer( struct Window *w )
  62. {
  63.    SetPointer(w, BusyPointerData, 16, 16, -6, 0);
  64. }
  65.  
  66.  
  67.  
  68. struct IntuiMessage *WaitForMessage( struct MsgPort *mport )
  69. {
  70.    struct IntuiMessage *imsg;
  71.  
  72.    for(;;)
  73.    {
  74.       imsg = (struct IntuiMessage*) GetMsg(mport);
  75.       if (imsg) return imsg;
  76.  
  77.       WaitPort(mport);
  78.    }
  79. }
  80.  
  81. struct Window *OpenWindowWithSharedUserPort( struct NewWindow *nw,
  82.                                              struct MsgPort   *shared )
  83. {
  84.    ULONG IDCMPbuf;
  85.    struct Window *w;
  86.  
  87.    IDCMPbuf       = nw->IDCMPFlags;
  88.    nw->IDCMPFlags = 0;  /* no IDCMP flags. */
  89.  
  90.    if (w = OpenWindow( nw ))
  91.    {
  92.       w->UserPort = shared;         /* assign UserPort. */
  93.       ModifyIDCMP( w, IDCMPbuf );   /* turn on IDCMP    */
  94.    }
  95.    nw->IDCMPFlags = IDCMPbuf; /* return 'nw' to its previous state. */
  96.    return w;
  97. }
  98.  
  99.  
  100. void StripIntuiMessages( struct Window *w )
  101. /*
  102.    *ASSUMES* a Forbid() has been called!
  103.  
  104.    Taken from 1.3 RKM:L&D, page 171
  105. */
  106. {
  107.    struct MsgPort *mp;
  108.    struct IntuiMessage *msg, *succ;
  109.  
  110.    mp = w->UserPort;
  111.  
  112.    /*
  113.     * Loop through all messages waiting at this port, remove any
  114.     * which are for Window 'w'.
  115.     */
  116.  
  117.    msg = (struct IntuiMessage*) mp->mp_MsgList.lh_Head;
  118.    while( succ = (struct IntuiMessage*) msg->ExecMessage.mn_Node.ln_Succ )
  119.    {
  120.       if (msg->IDCMPWindow == w)
  121.       {
  122.          Remove((struct Node *) msg);
  123.          ReplyMsg((struct Message *) msg);
  124.       }
  125.  
  126.       msg = succ;
  127.    }
  128. }
  129.  
  130. void CloseWindowWithSharedUserPort( struct Window *w )
  131.    /* Taken from 1.3 RKM:L&D, page 171, 'CloseWindowSafely()' */
  132. {
  133.    Forbid();               /* Turn off multitasking */
  134.  
  135.    StripIntuiMessages( w );  /* remove all messages for this window. */
  136.  
  137.    w->UserPort = NULL;
  138.    ModifyIDCMP( w, 0 ); /* prevents new messages from occuring. */
  139.    Permit();
  140.  
  141.    CloseWindow( w );
  142. }
  143.  
  144.  
  145. BOOL WindowSanityCheck( struct Screen *screen,
  146.                         Point         *location,
  147.                         Point         *size )
  148.    /* returns FALSE if location or size was changed. */
  149. {
  150.    BOOL ok = TRUE;
  151.  
  152.  
  153.    if (size->x > screen->Width)
  154.    {
  155.       ok = FALSE;
  156.       size->x = screen->Width;
  157.    }
  158.  
  159.    if (size->y > screen->Height )
  160.    {
  161.       ok = FALSE;
  162.       size->y = screen->Height;
  163.    }
  164.  
  165.    /* size is now ok, so check location. */
  166.    if (location->x + size->x >= screen->Width)
  167.    {
  168.       location->x = screen->Width - size->x;
  169.       ok = FALSE;
  170.    }
  171.    if (location->y + size->y >= screen->Height)
  172.    {
  173.       location->y = screen->Height - size->y;
  174.       ok = FALSE;
  175.    }
  176.  
  177.    return ok;
  178. }
  179.  
  180. #include <utility/tagitem.h>
  181.  
  182. UWORD minimal_pens [1] = { ~0 };
  183.  
  184. struct TagItem screen_tags[] =
  185. {
  186.    { SA_Pens, (ULONG) minimal_pens },
  187.    { TAG_END, 0 }
  188. };
  189.  
  190. struct Screen *SmartOpenScreen( struct NewScreen *newscreen )
  191. {
  192.    if (is_Workbench_v2())
  193.    {
  194.       return OpenScreenTagList( newscreen, screen_tags );
  195.    }
  196.    else
  197.       return OpenScreen( newscreen );
  198. }
  199.  
  200.  
  201. void RemapImage( struct Image *image )
  202. {
  203.    UWORD *plane1, *plane2, temp;
  204.    short i, planesize;
  205.  
  206.    planesize = ((image->Width+15)/16) * image->Height;
  207.  
  208.    plane1 = &image->ImageData[0];
  209.    plane2 = &image->ImageData[planesize];
  210.    for (i=0; i<planesize; i++)
  211.    {
  212.       temp      = plane1[i];
  213.       plane1[i] = plane2[i];
  214.       plane2[i] = temp;
  215.    }
  216. }